package com.bo.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * BigDecimalUtils
 */
public class BigDecimalUtils {

    /**
     * 加法方法 并处理null值
     *
     * @param num1
     * @param num2
     * @return 加法结果
     */
    public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
        if(num1 == null && num2 == null){
            return BigDecimal.ZERO;
        }else if(num1 == null){
            return num2;
        }else if(num2 == null){
            return num1;
        }
        return num1.add(num2);
    }

    /**
     * 减法方法 并处理null值
     *
     * @param num1 被减数
     * @param num2 减数
     * @return 减法结果
     */
    public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
        if(num1 == null && num2 == null){
            return BigDecimal.ZERO;
        }else if(num1 == null){
            return num2.negate();
        }else if(num2 == null){
            return num1;
        }
        return num1.subtract(num2);
    }

    /**
     * 乘法方法 并处理null值
     *
     * @param num1 被乘数
     * @param num2 乘数
     * @return 乘法结果
     */
    public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
        if (num1 == null || num2 == null) {
            return BigDecimal.ZERO;
        }
        return num1.multiply(num2);
    }

    /**
     * 重写的除法方法，处理除数为0的情况，并提供默认的舍入模式
     *
     * @param dividend 被除数
     * @param divisor  除数
     * @param scale    小数点后保留的位数
     * @return 除法结果
     * @throws ArithmeticException 如果除数为0
     */
    public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor, int scale) {
        if (dividend == null || divisor == null) {
            return BigDecimal.ZERO;
        }
        if (divisor.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        return dividend.divide(divisor, scale, RoundingMode.HALF_UP);
    }


    /**
     * 重写的除法方法，处理除数为0的情况
     *
     * @param dividend 被除数
     * @param divisor  除数
     * @param scale    小数点后保留的位数
     * @param roundingMode 舍入模式
     * @return 除法结果
     * @throws ArithmeticException 如果除数为0
     */
    public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor, int scale, RoundingMode roundingMode) {
        if (dividend == null || divisor == null) {
            return BigDecimal.ZERO;
        }
        if (divisor.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        return dividend.divide(divisor, scale, roundingMode);
    }

    /**
     * 获取小数部分
     * @param number
     * @return
     */
    public static BigDecimal getDecimalPart(BigDecimal number) {
        // 使用 remainder 方法获取小数部分
        BigDecimal integerPart = number.setScale(0, BigDecimal.ROUND_DOWN); // 获取整数部分
        return number.subtract(integerPart); // 小数部分 = 原数 - 整数部分
    }

    /**
     * 验证BigDecimal是否为整数
     * @param number
     * @return
     */
    public static boolean isInteger(BigDecimal number) {
        return number.compareTo(BigDecimal.ZERO) == 0 || getDecimalPart(number).compareTo(BigDecimal.ZERO) == 0;
    }



}
